Dependency Injection (DI) এবং Inversion of Control (IoC) দুটি খুব গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন, বিশেষ করে সফটওয়্যার অ্যাপ্লিকেশনগুলির মধ্যে কমপ্লেক্সিটি এবং মডিউলারিটি বৃদ্ধির জন্য। এই প্যাটার্নগুলি সাধারণত একে অপরের সাথে সম্পর্কিত, তবে তাদের কার্যকারিতা এবং উদ্দেশ্য ভিন্ন।
Dependency Injection (DI) একটি ডিজাইন প্যাটার্ন যা একটি অবজেক্টের ডিপেনডেন্সি (অর্থাৎ অন্য কোন অবজেক্টের সাথে সম্পর্ক) বাইরের থেকে সরবরাহ করার প্রক্রিয়া। এর মাধ্যমে অবজেক্টগুলির মধ্যে coupling বা সম্পর্ক কমানো যায়, যা কোডকে আরও মডুলার এবং টেস্টযোগ্য করে তোলে।
একটি ক্লাস যখন অন্য কোনো ক্লাসের উপর নির্ভরশীল (dependency) থাকে, তখন সেই নির্ভরতাটিকে সরাসরি ইনস্ট্যানশিয়েট করার পরিবর্তে বাইরের কোন কন্টেইনার (যেমন একটি DI কন্টেইনার) এর মাধ্যমে সরবরাহ করা হয়।
ধরা যাক, একটি Car
ক্লাস Engine
এর উপর নির্ভরশীল, এবং সেই Engine
ইনজেক্ট করা হবে Car ক্লাসে DI এর মাধ্যমে।
public class Engine
{
public void Start() => Console.WriteLine("Engine started");
}
public class Car
{
private readonly Engine _engine;
// Constructor Injection
public Car(Engine engine)
{
_engine = engine;
}
public void StartCar()
{
_engine.Start();
Console.WriteLine("Car started");
}
}
এখানে, Engine হল Car ক্লাসের একটি ডিপেনডেন্সি। Car ক্লাসের কনস্ট্রাক্টর প্যারামিটার হিসেবে Engine নেয়। আমরা এখন Engine ইনস্ট্যানশিয়েট করার দায়িত্ব DI কন্টেইনার বা অন্য কোথাও স্থানান্তরিত করি।
Inversion of Control (IoC) হল একটি মূল ধারণা বা প্রক্রিয়া যেখানে একটি সিস্টেমের নির্দিষ্ট কাজ বা নিয়ন্ত্রণ reverse করা হয়। সাধারনত, অ্যাপ্লিকেশন কোডে ফাংশনালিটি পরিচালনার জন্য মূল নিয়ন্ত্রণ (control) অ্যাপ্লিকেশন থেকে সরিয়ে বাইরে কোথাও স্থানান্তরিত করা হয়। এর মাধ্যমে কোডের আরও নমনীয়তা, রিয়ুজেবিলিটি এবং টেস্টেবলিটি নিশ্চিত করা যায়। IoC মূলত একটি বড় ধারণা, যার আওতায় Dependency Injection রয়েছে।
IoC তে, সাধারণত একটি কন্টেইনার বা ফ্রেমওয়ার্ক নিয়ন্ত্রণ নেয় যে কোন অবজেক্ট কখন এবং কীভাবে তৈরি হবে। এতে ক্লাসগুলি তাদের ডিপেনডেন্সি নিজে তৈরি করার বদলে বাইরের কন্টেইনার থেকে পাওয়ার মাধ্যমে কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা বাড়ায়।
ধরা যাক, একটি Car এবং Engine সিস্টেমে IoC প্রয়োগ করা হচ্ছে যেখানে কন্টেইনার নিয়ন্ত্রণ করবে কিভাবে Engine এবং Car ইনস্ট্যানশিয়েট হবে।
public class IoCContainer
{
public static T Resolve<T>()
{
if (typeof(T) == typeof(Car))
return (T)(object)new Car(new Engine());
else if (typeof(T) == typeof(Engine))
return (T)(object)new Engine();
throw new Exception("Type not registered");
}
}
এখানে, IoCContainer ক্লাস একটি সাধারন IoC কন্টেইনার হিসেবে কাজ করছে। এটি জানে কিভাবে Car এবং Engine ইনস্ট্যানশিয়েট করতে হবে। যখন Resolve() বা Resolve() মেথড কল করা হবে, তখন কন্টেইনার তার প্রয়োজনীয় ডিপেনডেন্সি ইনজেক্ট করবে এবং উপযুক্ত অবজেক্টটি রিটার্ন করবে।
Dependency Injection হল একটি নির্দিষ্ট কৌশল যা Inversion of Control এর সাথে সম্পর্কিত। আসলে, DI হল IoC এর একটি উপায়, কিন্তু IoC এর অধীনে আরও অন্যান্য কৌশল যেমন Service Locator এবং Event-based IoC থাকতে পারে।
বৈশিষ্ট্য | Dependency Injection (DI) | Inversion of Control (IoC) |
---|---|---|
কাজের দৃষ্টিকোণ | নির্ভরতাগুলি বাইরের থেকে ইনজেক্ট করা হয় | নিয়ন্ত্রণ সিস্টেমের বাইরে স্থানান্তরিত করা হয় |
প্রযুক্তিগত দৃষ্টিকোণ | DI IoC এর একটি অংশ | IoC একটি ব্যাপক ধারণা, যার মধ্যে DI একটি পদ্ধতি |
কার্যপ্রণালী | নির্ভরতাগুলি সঠিকভাবে ইনজেক্ট করা হয় | অবজেক্ট নির্মাণের নিয়ন্ত্রণ বাইরের কন্টেইনারে দেওয়া হয় |
Dependency Injection (DI) এবং Inversion of Control (IoC) দুটি ডিজাইন প্যাটার্ন অ্যাপ্লিকেশনের কোডকে আরো নমনীয়, টেস্টযোগ্য এবং মডুলার করতে সাহায্য করে। DI ব্যবহার করে নির্ভরতাগুলির ইনজেকশন নিয়ন্ত্রণ করা হয়, যা কোডের coupling কমাতে এবং loose coupling বজায় রাখতে সহায়ক। অন্যদিকে, IoC বৃহত্তর ধারণা যা কোডের নিয়ন্ত্রণ বাইরের কন্টেইনারে স্থানান্তরিত করে।
Dependency Injection (DI) একটি ডিজাইন প্যাটার্ন যা সফটওয়্যার ডেভেলপমেন্টে ব্যবহৃত হয়, বিশেষ করে অ্যাপ্লিকেশনগুলিতে যেখানে বিভিন্ন ক্লাসের মধ্যে নির্ভরশীলতা (dependencies) থাকে। এই প্যাটার্নটির মাধ্যমে, ক্লাসগুলোর মধ্যে নির্ভরশীলতা সরাসরি ইনস্ট্যান্সিয়েট বা তৈরি করা না হয়ে, বাইরের কোনও উৎস (যেমন একটি IoC Container বা Dependency Injection Container) থেকে সরবরাহ করা হয়।
DI একটি গুরুত্বপূর্ণ কৌশল যা ক্লাসগুলোকে একে অপরের উপর নির্ভরশীলতা কমাতে সাহায্য করে এবং Loosely Coupled (অর্থাৎ, একে অপরের থেকে স্বাধীন) কোড তৈরিতে সহায়ক হয়।
Dependency Injection এমন একটি প্রক্রিয়া যেখানে একটি ক্লাস তার প্রয়োজনীয় ডিপেনডেন্সি (অথবা নির্ভরশীল অবজেক্ট) বাইরের একটি সোর্স থেকে পায়, না যে নিজে তা তৈরি করে। এটি Inversion of Control (IoC) এর একটি বিশেষ রূপ, যেখানে ক্লাস নিজে তার নির্ভরশীলতাগুলো তৈরি করার পরিবর্তে বাইরের একটি কনটেইনার বা ফ্যাক্টরি এসব নির্ভরশীলতা সরবরাহ করে।
ধরা যাক, একটি OrderService
ক্লাস আছে যা PaymentService
এবং CustomerService
এর উপর নির্ভরশীল। DI ব্যবহার না করলে, OrderService
নিজেই এই সেবাগুলোর ইনস্ট্যান্স তৈরি করবে। কিন্তু Dependency Injection এর মাধ্যমে, এই সেবাগুলোর ইনস্ট্যান্স সরবরাহ করা হয় বাইরের কোনও সোর্স থেকে (যেমন IoC Container)।
Constructor Injection:
উদাহরণ:
public class OrderService
{
private readonly IPaymentService _paymentService;
private readonly ICustomerService _customerService;
// Constructor Injection
public OrderService(IPaymentService paymentService, ICustomerService customerService)
{
_paymentService = paymentService;
_customerService = customerService;
}
}
এখানে, OrderService ক্লাসের কনস্ট্রাক্টরে PaymentService এবং CustomerService ইনজেক্ট করা হচ্ছে।
Property Injection:
উদাহরণ:
public class OrderService
{
public IPaymentService PaymentService { get; set; }
public ICustomerService CustomerService { get; set; }
// Property Injection
}
Method Injection:
উদাহরণ:
public class OrderService
{
public void ProcessOrder(IPaymentService paymentService, ICustomerService customerService)
{
// Process order using the injected services
}
}
একটি DI Container বা Inversion of Control (IoC) Container হল এমন একটি ফ্রেমওয়ার্ক বা লাইব্রেরি যা নির্ভরশীলতা পরিচালনা করে। এটি ক্লাসের নির্ভরশীলতাগুলো ইনজেক্ট করার কাজ সহজ করে দেয়। .NET Framework, ASP.NET Core, Spring (Java) এর মতো জনপ্রিয় ফ্রেমওয়ার্কগুলো এই ধরনের কন্টেইনার ব্যবহার করে।
ASP.NET Core এ DI কন্টেইনারের মাধ্যমে, আপনি কনস্ট্রাক্টর ইনজেকশন বা অন্য কোনো পদ্ধতি ব্যবহার করে নির্ভরশীলতা ইনজেক্ট করতে পারেন।
উদাহরণ:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Register dependencies
services.AddScoped<IPaymentService, PaymentService>();
services.AddScoped<ICustomerService, CustomerService>();
services.AddScoped<OrderService>();
}
}
এখানে, OrderService
এর নির্ভরশীলতাগুলি PaymentService
এবং CustomerService
DI কন্টেইনারে রেজিস্টার করা হচ্ছে।
Dependency Injection হল একটি প্যাটার্ন যা কোডের মধ্যে ক্লাসগুলোর মধ্যে নির্ভরশীলতা কমিয়ে দেয় এবং কোডকে আরও মেইনটেইনেবল ও টেস্টেবল করে তোলে। এটি বিভিন্ন ধরণের ইনজেকশন পদ্ধতির মাধ্যমে নির্ভরশীলতাগুলো সরবরাহ করে, যার মাধ্যমে কোডের নমনীয়তা বৃদ্ধি পায় এবং ফ্লেক্সিবিলিটি নিশ্চিত হয়। DI ব্যবহারের মাধ্যমে আপনি সহজেই ক্লাসের নির্ভরশীলতা ম্যানেজ করতে পারেন এবং ডিপেনডেন্সি চেইন তৈরির ঝামেলা এড়িয়ে যেতে পারেন।
Inversion of Control (IoC) containers হল একটি শক্তিশালী প্যাটার্ন যা সফটওয়্যার ডেভেলপমেন্টে অ্যাপ্লিকেশন কম্পোনেন্টগুলির মধ্যে ডিপেনডেন্সি ম্যানেজ করতে সহায়তা করে। MVVM প্যাটার্নে IoC Containers ব্যবহৃত হয় ViewModel এর ডিপেনডেন্সি ইনজেকশন (Dependency Injection) করতে, যা কোডের রিইউজেবিলিটি এবং টেস্টেবিলিটি বৃদ্ধি করে। IoC ব্যবহারে অ্যাপ্লিকেশনটির বিভিন্ন অংশের মধ্যে দৃঢ় জড়িত সম্পর্ক কমে যায়, এবং কোডের পরিচালনা সহজ হয়।
IoC Containers হল এমন একটি মেকানিজম যা ডিপেনডেন্সি ইনজেকশন এবং অবজেক্ট লifecycle ম্যানেজ করতে সাহায্য করে। এটি প্রধানত ViewModel এবং অন্যান্য কম্পোনেন্টের মধ্যে ডিপেনডেন্সি সংযোগ স্থাপন করে, যার ফলে আপনাকে ম্যানুয়ালি ইনস্ট্যান্স তৈরি বা ডিপেনডেন্সি হ্যান্ডল করতে হয় না।
MVVM প্যাটার্নে, IoC Containers এমনভাবে কাজ করে যাতে ViewModel এবং অন্যান্য লজিকাল ইউনিটগুলির মধ্যে সম্পর্ক স্বয়ংক্রিয়ভাবে নির্ধারণ হয়। এর ফলে ViewModel-এ বাইন্ডিং এবং ডিপেনডেন্সির মধ্যে অবিচ্ছিন্ন বিভাজন বজায় রাখা সম্ভব হয়।
IoC Containers ব্যবহারের মাধ্যমে ViewModel এর ডিপেনডেন্সি (যেমন সার্ভিস বা রিপোজিটরি) স্বয়ংক্রিয়ভাবে ইনজেক্ট করা হয়। সাধারণত Dependency Injection (DI) কনটেইনার ব্যবহার করে আমরা ViewModel এর জন্য ডিপেনডেন্সি ইনজেক্ট করি, যাতে ক্লাসের মধ্যে সঠিক ইনস্ট্যান্স সরবরাহ করা যায়।
ধরা যাক, আপনার অ্যাপ্লিকেশনটি একটি ProductService এবং একটি UserService ডিপেনডেন্সি নিয়েছে। আমরা এখানে IoC Container ব্যবহার করব ViewModel এ ProductService এবং UserService ইনজেক্ট করার জন্য।
Unity Container বা Ninject এর মতো জনপ্রিয় IoC কন্টেইনার গুলি .NET Framework এবং .NET Core অ্যাপ্লিকেশনে ব্যবহৃত হয়। এখানে আমরা Unity কন্টেইনার ব্যবহার করে একটি উদাহরণ দেখব।
প্রথমে, Unity কন্টেইনার প্রজেক্টে ইনস্টল করতে হবে। NuGet এর মাধ্যমে Unity প্যাকেজ ইনস্টল করুন:
Install-Package Unity
এখন ProductService এবং UserService নামে দুটি সার্ভিস তৈরি করা যাক, এবং তাদের ইনজেকশন ব্যবস্থাপনা ViewModel-এ করব।
// ProductService.cs
public class ProductService : IProductService
{
public string GetProductInfo()
{
return "Product information";
}
}
// UserService.cs
public class UserService : IUserService
{
public string GetUserInfo()
{
return "User information";
}
}
এখন, একটি ViewModel তৈরি করব যেখানে এই সার্ভিস দুটি ইনজেক্ট করা হবে।
// ProductViewModel.cs
public class ProductViewModel
{
private readonly IProductService _productService;
private readonly IUserService _userService;
public ProductViewModel(IProductService productService, IUserService userService)
{
_productService = productService;
_userService = userService;
}
public string GetProductAndUserInfo()
{
return _productService.GetProductInfo() + " | " + _userService.GetUserInfo();
}
}
এখন, Unity Container ব্যবহার করে ProductViewModel এবং তার ডিপেনডেন্সি সার্ভিসগুলিকে রেজিস্টার করা হবে। এটি সাধারণত App.xaml.cs বা MainPage.xaml.cs তে করা হয়।
using Unity;
public class App : Application
{
private IUnityContainer _container;
public App()
{
_container = new UnityContainer();
// ডিপেনডেন্সি রেজিস্ট্রেশন
_container.RegisterType<IProductService, ProductService>();
_container.RegisterType<IUserService, UserService>();
_container.RegisterType<ProductViewModel>();
InitializeComponent();
}
protected override void OnStart()
{
// ViewModel ইনস্ট্যান্সিং
var viewModel = _container.Resolve<ProductViewModel>();
// ViewModel ব্যবহার
Console.WriteLine(viewModel.GetProductAndUserInfo());
}
}
এখানে, আমরা UnityContainer এর মাধ্যমে IProductService এবং IUserService রেজিস্টার করেছি এবং ProductViewModel এর একটি ইনস্ট্যান্স তৈরি করেছি। IoC কন্টেইনার স্বয়ংক্রিয়ভাবে ProductViewModel এ প্রয়োজনীয় সার্ভিসগুলো ইনজেক্ট করবে।
MVVM প্যাটার্নে IoC Containers ব্যবহার করা কোডের ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করে। এটি ViewModel এবং অন্যান্য সার্ভিসের মধ্যে সম্পর্ক স্বয়ংক্রিয়ভাবে তৈরি করতে সহায়তা করে, এবং কোডের রিইউজেবিলিটি ও টেস্টেবিলিটি বৃদ্ধি করে। IoC কন্টেইনার ব্যবহারে অ্যাপ্লিকেশনটির কোড এবং লজিক ভালোভাবে পৃথক রাখা সম্ভব হয়, যা অ্যাপ্লিকেশনটির বজায় রাখা এবং সম্প্রসারণ সহজ করে তোলে।
ViewModel Locator এবং Service Locator প্যাটার্নগুলি MVVM (Model-View-ViewModel) আর্কিটেকচারে ব্যবহৃত জনপ্রিয় ডিজাইন প্যাটার্ন। এগুলি মূলত ViewModel এবং Service এর মধ্যে ডিপেনডেন্সি ইনজেকশন (Dependency Injection) এবং উপযুক্ত অবজেক্টের সমর্থন প্রদান করে। তবে, তাদের ব্যবহারের উদ্দেশ্য এবং অ্যাপ্লিকেশনে তাদের প্রভাব আলাদা।
এখানে ViewModel Locator এবং Service Locator প্যাটার্ন সম্পর্কে বিস্তারিত আলোচনা করা হয়েছে।
ViewModel Locator প্যাটার্নটি MVVM প্যাটার্নে ব্যবহৃত হয় যেখানে View এবং ViewModel এর মধ্যে ডিপেনডেন্সি ম্যানেজমেন্ট সহজতর করা হয়। এর মাধ্যমে ViewModel কে ম্যানুয়ালি ইনস্ট্যান্সিয়েট বা ইনজেক্ট না করে, স্বয়ংক্রিয়ভাবে ViewModel কে নির্দিষ্ট View এর জন্য প্রস্তুত করা হয়।
public class ViewModelLocator
{
public MainViewModel MainViewModel
{
get
{
return new MainViewModel(); // এই অংশে Dependency Injection ব্যবহার করা যেতে পারে
}
}
}
<Window x:Class="MVVMExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MVVMExample"
Title="Main Window" Height="350" Width="525">
<Window.DataContext>
<local:ViewModelLocator />
</Window.DataContext>
<Grid>
<!-- ViewModel থেকে ডেটা বাইন্ডিং -->
<TextBlock Text="{Binding MainViewModel.SomeProperty}" />
</Grid>
</Window>
এখানে MainViewModel কে ViewModelLocator এর মাধ্যমে View এর DataContext এ সেট করা হচ্ছে।
Service Locator প্যাটার্নটি ডিপেনডেন্সি ইনজেকশন (DI) এর একটি বিকল্প পদ্ধতি, যেখানে অ্যাপ্লিকেশনটি তার ডিপেনডেন্সিগুলি (services) একটি কেন্দ্রীয় পয়েন্ট থেকে সংগৃহীত করে। Service Locator একটি সেন্ট্রালাইজড অবজেক্ট প্রদান করে যা সমস্ত Service বা Dependency এর ইনস্ট্যান্স তৈরি এবং সরবরাহ করে।
public class ServiceLocator
{
private static readonly Dictionary<Type, object> _services = new Dictionary<Type, object>();
public static void Register<TService>(TService service)
{
_services[typeof(TService)] = service;
}
public static TService GetService<TService>()
{
return (TService)_services[typeof(TService)];
}
}
ServiceLocator.Register<IProductService>(new ProductService());
public class MainViewModel
{
private readonly IProductService _productService;
public MainViewModel()
{
_productService = ServiceLocator.GetService<IProductService>();
}
}
এখানে, ServiceLocator ব্যবহার করে ViewModel তার প্রয়োজনীয় IProductService ডিপেনডেন্সি সংগ্রহ করছে।
বৈশিষ্ট্য | ViewModel Locator | Service Locator |
---|---|---|
প্রধান উদ্দেশ্য | ViewModel এর ইনস্ট্যান্স ম্যানেজমেন্ট | Service বা Dependency গুলি কেন্দ্রীভূতভাবে ম্যানেজ করা |
ডিপেনডেন্সি ইনজেকশন | সাধারাণত ব্যবহৃত হয় ViewModel এর মধ্যে ডিপেনডেন্সি ম্যানেজ করতে | ডিপেনডেন্সি সরাসরি Service Locator থেকে ইনজেক্ট করা হয় |
কোড কমপ্লেক্সিটি | মাঝারি (কমপ্লেক্স ViewModel এর জন্য) | বেশিরভাগ ক্ষেত্রে সোজা, তবে অনেক services যুক্ত হলে জটিল হতে পারে |
Testability | কিছুটা কষ্টকর হতে পারে, কারণ ViewModel Locator কোডে দৃঢ় coupling হতে পারে | সমস্যা হতে পারে, কারণ services কোডে দৃশ্যমান থাকে না |
এভাবে, ViewModel Locator এবং Service Locator প্যাটার্নগুলি MVVM অ্যাপ্লিকেশনে ডিপেনডেন্সি ম্যানেজমেন্ট এবং ক্লাসের লাইফসাইকেল পরিচালনা করার জন্য ব্যবহৃত হয়, তবে তাদের ব্যবহারে বিভিন্ন সুবিধা এবং চ্যালেঞ্জ থাকে।
Inversion of Control (IoC) এবং Dependency Injection (DI) প্রযুক্তি MVVM অ্যাপ্লিকেশনে অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যখন অ্যাপ্লিকেশনটি বড় এবং স্কেলেবল হয়। IoC কন্টেইনার ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনের বিভিন্ন কম্পোনেন্টের মধ্যে নির্ভরতা (dependency) সহজভাবে ম্যানেজ করা যায়, এবং এর ফলে কোডের পুনঃব্যবহারযোগ্যতা এবং মেইনটেনেবিলিটি বৃদ্ধি পায়।
এখানে আলোচনা করা হবে Unity এবং Autofac এর মতো জনপ্রিয় IoC (Inversion of Control) Frameworks কীভাবে MVVM অ্যাপ্লিকেশনে ইন্টিগ্রেট করা যায়।
Unity হল একটি IoC কন্টেইনার যা .NET এ Dependency Injection এবং Inversion of Control এর জন্য ব্যবহৃত হয়। Unity ফ্রেমওয়ার্কে বিভিন্ন ডিপেনডেন্সি ইনজেকশন কৌশল ব্যবহার করে সহজে অ্যাপ্লিকেশন তৈরি করা যায়।
প্রথমে, UnityContainer সেটআপ করতে হয় এবং তারপর এতে ডিপেনডেন্সি নিবন্ধন করতে হয়।
using Unity;
public class Bootstrapper
{
public static IUnityContainer Container { get; private set; }
public static void Initialize()
{
Container = new UnityContainer();
// Register types
Container.RegisterType<IEmployeeModel, EmployeeModel>();
Container.RegisterType<IMainViewModel, MainViewModel>();
// Other registrations...
}
}
এখানে, IEmployeeModel এবং IMainViewModel এর জন্য ডিপেনডেন্সি UnityContainer এ নিবন্ধিত হয়েছে।
অ্যাপ্লিকেশন শুরু হলে, আপনি UnityContainer ব্যবহার করে ডিপেনডেন্সি রেজোল্ভ (resolve) করতে পারেন। এই রেজোলভ করার মাধ্যমে, আপনি ViewModel বা Model এর জন্য নির্ভরশীল আইটেম পেতে পারেন।
public class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Resolve ViewModel from Unity container
var viewModel = Bootstrapper.Container.Resolve<IMainViewModel>();
this.DataContext = viewModel;
}
}
এখানে, MainWindow এ IMainViewModel এর ডিপেনডেন্সি UnityContainer থেকে রেজোল্ভ করা হচ্ছে এবং DataContext হিসেবে সেট করা হচ্ছে।
Autofac আরেকটি জনপ্রিয় IoC কন্টেইনার যা ডিপেনডেন্সি ইনজেকশন (DI) এবং Inversion of Control (IoC) সমর্থন করে। এটি অনেক বেশি ফিচারযুক্ত এবং স্কেলেবল।
Autofac ব্যবহার করার জন্য প্রথমে কনটেইনার সেটআপ করতে হবে এবং তারপর ডিপেনডেন্সি রেজিস্টার করতে হবে।
using Autofac;
public class Bootstrapper
{
public static IContainer Container { get; private set; }
public static void Initialize()
{
var builder = new ContainerBuilder();
// Register types
builder.RegisterType<EmployeeModel>().As<IEmployeeModel>();
builder.RegisterType<MainViewModel>().As<IMainViewModel>();
// Build container
Container = builder.Build();
}
}
এখানে, ContainerBuilder ব্যবহার করে EmployeeModel এবং MainViewModel এর জন্য ডিপেনডেন্সি রেজিস্টার করা হয়েছে।
এখন, Autofac কন্টেইনার থেকে ডিপেনডেন্সি রেজোল্ভ করতে হবে। MainWindow এ ViewModel ইনজেক্ট করার উদাহরণ:
public class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Resolve ViewModel from Autofac container
var viewModel = Bootstrapper.Container.Resolve<IMainViewModel>();
this.DataContext = viewModel;
}
}
এখানে, MainWindow এ IMainViewModel এর ডিপেনডেন্সি Autofac Container থেকে রেজোল্ভ করা হচ্ছে এবং DataContext হিসেবে সেট করা হচ্ছে।
MVVM প্যাটার্নে, IoC কন্টেইনার ব্যবহার করার মাধ্যমে ViewModel এবং Model এর মধ্যে ডিপেনডেন্সি ম্যানেজমেন্ট সহজ হয়। সাধারণত, ViewModel এর জন্য ডিপেনডেন্সি ইনজেকশনের মাধ্যমে Model এবং অন্যান্য সেবা (services) ইনজেক্ট করা হয়। এই পদ্ধতি অ্যাপ্লিকেশনটির কোড রিয়ুজেবিলিটি, টেস্টেবিলিটি এবং মেইনটেনেবিলিটি উন্নত করে।
উদাহরণস্বরূপ, যদি আপনার ViewModel এর মধ্যে কোনো Model বা Service ক্লাসের ইনস্ট্যান্স প্রয়োজন হয়, তবে IoC কন্টেইনার তার ডিপেনডেন্সি স্বয়ংক্রিয়ভাবে ইনজেক্ট করবে। এইভাবে, আপনার ViewModel এর কোড সরাসরি কোনো Model বা Service ক্লাসের উপর নির্ভরশীল থাকে না, বরং এটি কন্টেইনার থেকে রেজোল্ভ হয়।
public class MainViewModel : INotifyPropertyChanged
{
private readonly IEmployeeModel _employeeModel;
public MainViewModel(IEmployeeModel employeeModel)
{
_employeeModel = employeeModel;
}
}
এখানে, IEmployeeModel ইনজেক্ট করা হচ্ছে MainViewModel এর কনস্ট্রাক্টরে এবং কন্টেইনারের মাধ্যমে তার ইনস্ট্যান্স রেজোল্ভ করা হবে।
ইন্টিগ্রেটেড IoC কন্টেইনারের মাধ্যমে আপনি Commands ইনজেক্ট করতে পারেন যা ViewModel এ Command Binding এর মাধ্যমে কাজ করে।
public class MainViewModel : INotifyPropertyChanged
{
public ICommand SaveCommand { get; private set; }
public MainViewModel()
{
SaveCommand = new DelegateCommand(ExecuteSaveCommand);
}
private void ExecuteSaveCommand()
{
// Command execution logic
}
}
এখানে, DelegateCommand বা অন্যান্য কমান্ড কন্ট্রোলার ইঞ্জেক্ট করা হতে পারে এবং সেই কমান্ডটি View তে বাইনড হবে।
IoC (Inversion of Control) এবং Dependency Injection (DI) এর মাধ্যমে MVVM অ্যাপ্লিকেশনের বিভিন্ন উপকারিতা পাওয়া যায়:
Unity এবং Autofac এর মতো জনপ্রিয় IoC কন্টেইনার ব্যবহার করে MVVM অ্যাপ্লিকেশনগুলোতে ডিপেনডেন্সি ইনজেকশন এবং ইনভার্সন অফ কন্ট্রোল প্রয়োগ করা সম্ভব। এর মাধ্যমে অ্যাপ্লিকেশনটির কোড আরো মডুলার, স্কেলেবল এবং টেস্টেবল হয়ে ওঠে, যা দীর্ঘমেয়াদী উন্নয়ন ও মেইনটেনেন্সের জন্য উপকারী।
common.read_more